import os
import sys
import os
import argparse
import logging
from datetime import datetime

# 添加当前目录到Python路径
sys.path.append(os.path.dirname(os.path.abspath(__file__)))

# 导入耕地提取器
from sam2_crop_extractor import extract_crop_fields_from_image
from utils.common_utils import setup_logger
from config import Config


def main():
    """
    耕地地块提取器启动脚本
    提供命令行界面来运行耕地地块提取功能
    """
    # 创建参数解析器
    parser = argparse.ArgumentParser(description='遥感耕地地块提取器')
    
    # 必选参数：输入影像路径
    parser.add_argument('-i', '--input', required=True, help='输入遥感影像文件路径（支持TIFF、JPG、PNG等格式）')
    
    # 可选参数
    parser.add_argument('-o', '--output', help='输出矢量文件路径（默认保存在results目录下）')
    parser.add_argument('-f', '--format', choices=['shp', 'geojson'], default='shp', help='输出文件格式（默认为Shapefile）')
    parser.add_argument('-c', '--confidence', type=float, default=Config.SAM2_CONFIDENCE_THRESHOLD, 
                      help=f'置信度阈值（默认：{Config.SAM2_CONFIDENCE_THRESHOLD}）')
    parser.add_argument('-a', '--area', type=float, default=Config.MIN_CROP_AREA, 
                      help=f'最小耕地面积（平方米，默认：{Config.MIN_CROP_AREA}）')
    parser.add_argument('-l', '--log-level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], 
                      default='INFO', help='日志级别（默认：INFO）')
    
    # 解析参数
    args = parser.parse_args()
    
    # 检查输入文件是否存在
    if not os.path.exists(args.input):
        print(f"错误：输入文件不存在: {args.input}")
        sys.exit(1)
    
    # 创建logs目录
    logs_dir = 'logs'
    os.makedirs(logs_dir, exist_ok=True)
    
    # 设置日志
    log_file = os.path.join(logs_dir, f"extraction_{datetime.now().strftime('%Y%m%d_%H%M%S')}.log")
    logger = setup_logger(log_file, args.log_level)
    
    # 记录开始信息
    logger.info("=====================================")
    logger.info("       遥感耕地地块提取开始         ")
    logger.info("=====================================")
    logger.info(f"输入文件: {args.input}")
    logger.info(f"输出格式: {args.format.upper()}")
    if args.output:
        logger.info(f"输出文件: {args.output}")
    
    # 打印运行信息到控制台
    print("=====================================")
    print("       遥感耕地地块提取器           ")
    print("=====================================")
    print(f"正在处理: {args.input}")
    print(f"输出格式: {args.format.upper()}")
    print(f"日志文件: {log_file}")
    print("请稍候，正在提取耕地地块...")
    
    try:
        # 运行耕地提取器
        output_file = extract_crop_fields_from_image(
            image_path=args.input,
            output_path=args.output,
            output_format=args.format,
            confidence_threshold=args.confidence,
            min_crop_area=args.area
        )
        
        # 记录和打印完成信息
        logger.info(f"耕地地块提取完成！")
        logger.info(f"结果已保存至: {output_file}")
        logger.info("=====================================")
        
        print("\n=====================================")
        print(f"耕地地块提取完成！")
        print(f"结果已保存至: {output_file}")
        print("=====================================")
        
        return 0
        
    except Exception as e:
        # 记录错误信息
        logger.error(f"处理过程中发生错误: {e}")
        import traceback
        logger.error(traceback.format_exc())
        
        # 打印错误信息到控制台
        print(f"\n错误: {e}")
        print("请查看日志文件获取详细信息")
        
        return 1


if __name__ == "__main__":
    sys.exit(main())